//用文本编辑器建立文件Calc.java把以下代码拷入，存盘后用命令javac Calc.java编译成Calc.class文件，然后用命令java Calc即可
//design by SunYi and YangShangYing
//my email footballreg@sohu.com
//my phone 13611152520
//Calculator 0.4
package javase.swing;
import java.awt.*;
import java.awt.event.*;
import java.math.*;
import java.lang.*;


public class Calc extends WindowAdapter implements ActionListener,KeyListener{

//result�����������Ľ��data1���浱ǰ�������������(��һ����������֣���������ָ�����ϵ�ĳ�����ּ�radixPointDepth���浱ǰ�����������С����ĵڼ�λ������radixPointIndicate�����Ƿ�������
private double result=0,data1=0,radixPointDepth=1,memData=0;

//radixPointIndicate��¼С����Ƿ񱻰��£������º�Ϊtrue,equalSignPressIndicate��¼��һ�ο��Ƽ��Ƿ�Ϊ�Ⱥţ�Ϊ�Ⱥ���Ϊtrue,numberPressIndicate��¼��һ�ΰ����Ƿ�Ϊ���֣�����.�ţ�����Ϊtrue,memDataIndicate��¼�ڴ����Ƿ�����ݣ���Ϊtrue
private boolean radixPointIndicate=false,equalSignPressIndicate=false,numberPressIndicate=false,memDataIndicate=false;

private String s;
private char prec='+';
private Frame f;
private TextField tf;
private Button b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51,b52,b53,b54;
private Panel p,pScientific,pAngle;
private Color blue,red,gold;
private Double displayNumber=new Double(data1);


static public void main(String args[]){

Calc de=new Calc();
de.go();
}

public void go(){

//����Ϊ�������ɲ���

Color blue=new Color(0,0,255);
Color red=new Color(150,0,0);
Color green=new Color(0,255,0);
Color gold=new Color(255,215,0);
Color orange=new Color(255,165,0);
Color white=new Color(255,255,255);
Color black=new Color(50,50,50);

Color DeepSkyBlue3=new Color(0,154,205); 
Color NavyBlue=new Color(0,0,128);

Color DarkGreen=new Color(0,100,0);

Color snow1=new Color(255,250,250);
Color snow2=new Color(238,233,233);
Color snow3=new Color(205,201,201);
Color red1=new Color(220,0,0);


Font font1=new Font("TimesRoman",Font.BOLD,18);
Font font2=new Font("SansSerif",Font.PLAIN,14); 

//��������
f=new Frame("JavaCalculator 0.4 by SunYang");

//���һ�����������

pAngle=new Panel();


p=new Panel();

GridLayout gridLayout1=new GridLayout(5,6);
gridLayout1.setHgap(0);
gridLayout1.setVgap(0);
p.setLayout(gridLayout1); 

tf=new TextField("0.0",30);


tf.setFont(font1);
p.setFont(font2);


tf.setEditable(false);


b1=new Button(" ");
b2=new Button(" ");
b3=new Button("Back");
b4=new Button("CE");
b5=new Button("C");
b6=new Button("OFF");
b7=new Button("7");
b8=new Button("8");
b9=new Button("9");
b10=new Button("/");
b11=new Button("sqrt");
b12=new Button("MC");
b13=new Button("4");
b14=new Button("5");
b15=new Button("6");
b16=new Button("*");
b17=new Button("%");
b18=new Button("MR");
b19=new Button("1");
b20=new Button("2");
b21=new Button("3");
b22=new Button("-");
b23=new Button("1/x");
b24=new Button("MS");
b25=new Button("0");
b26=new Button("+/-");
b27=new Button(".");
b28=new Button("+");
b29=new Button("=");
b30=new Button("M+");

f.add(tf,"North");
f.add(p,"Center");
f.add(pAngle,"South");

p.add(b1);
p.add(b2);
p.add(b3);
p.add(b4);
p.add(b5);
p.add(b6);

p.add(b12);
p.add(b7);
p.add(b8);
p.add(b9);
p.add(b10);
p.add(b11);
p.add(b18);
p.add(b13);
p.add(b14);
p.add(b15);
p.add(b16);
p.add(b17);
p.add(b24);
p.add(b19);
p.add(b20);
p.add(b21);
p.add(b22);
p.add(b23);
p.add(b30);
p.add(b25);
p.add(b26);
p.add(b27);
p.add(b28);
p.add(b29);



f.addKeyListener(this);
p.addKeyListener(this);
tf.addKeyListener(this);
b1.addKeyListener(this);
b2.addKeyListener(this);
b3.addKeyListener(this);
b4.addKeyListener(this);
b5.addKeyListener(this);
b6.addKeyListener(this);
b7.addKeyListener(this);
b8.addKeyListener(this);
b9.addKeyListener(this);
b10.addKeyListener(this);
b11.addKeyListener(this);
b12.addKeyListener(this);
b13.addKeyListener(this);
b14.addKeyListener(this);
b15.addKeyListener(this);
b16.addKeyListener(this);
b17.addKeyListener(this);
b18.addKeyListener(this);
b19.addKeyListener(this);
b20.addKeyListener(this);
b21.addKeyListener(this);
b22.addKeyListener(this);
b23.addKeyListener(this);
b24.addKeyListener(this);
b25.addKeyListener(this);
b26.addKeyListener(this);
b27.addKeyListener(this);
b28.addKeyListener(this);
b29.addKeyListener(this);
b30.addKeyListener(this);



b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
b5.addActionListener(this);
b6.addActionListener(this);
b7.addActionListener(this);
b8.addActionListener(this);
b9.addActionListener(this);
b10.addActionListener(this);
b11.addActionListener(this);
b12.addActionListener(this);
b13.addActionListener(this);
b14.addActionListener(this);
b15.addActionListener(this);
b16.addActionListener(this);
b17.addActionListener(this);
b18.addActionListener(this);
b19.addActionListener(this);
b20.addActionListener(this);
b21.addActionListener(this);
b22.addActionListener(this);
b23.addActionListener(this);
b24.addActionListener(this);
b25.addActionListener(this);
b26.addActionListener(this);
b27.addActionListener(this);
b28.addActionListener(this);
b29.addActionListener(this);
b30.addActionListener(this);

/*
//��ɿ�ѧ����������

b31=new Button("hyp");
b32=new Button("sin");
b33=new Button("cos");
b34=new Button("tan");
b35=new Button("F-E");
b36=new Button("n!");
b37=new Button("DEG");
b38=new Button("ln");
b39=new Button("log");
b40=new Button("a");
b41=new Button("b");
b42=new Button("->");
b43=new Button("exp");
b44=new Button("y^x");
b45=new Button("x^-2");
b46=new Button("x^2");
b47=new Button("(");
b48=new Button(")");
b49=new Button("A");
b50=new Button("B");
b51=new Button("C");
b52=new Button("D");
b53=new Button("E");
b54=new Button("F");


b31.addActionListener(this);
b32.addActionListener(this);
b33.addActionListener(this);
b34.addActionListener(this);
b35.addActionListener(this);
b36.addActionListener(this);
b37.addActionListener(this);
b38.addActionListener(this);
b39.addActionListener(this);
b40.addActionListener(this);
b41.addActionListener(this);
b42.addActionListener(this);
b43.addActionListener(this);
b44.addActionListener(this);
b45.addActionListener(this);
b46.addActionListener(this);
b47.addActionListener(this);
b48.addActionListener(this);
b49.addActionListener(this);
b50.addActionListener(this);
b51.addActionListener(this);
b52.addActionListener(this);
b53.addActionListener(this);
b54.addActionListener(this);



p.add(b31);
p.add(b32);
p.add(b33);
p.add(b34);
p.add(b35);
p.add(b36);
p.add(b37);
p.add(b38);
p.add(b39);
p.add(b40);
p.add(b41);
p.add(b42);
p.add(b43);
p.add(b44);
p.add(b45);
p.add(b46);
p.add(b47);
p.add(b48);
p.add(b49);
p.add(b50);
p.add(b51);
p.add(b52);
p.add(b53);
p.add(b54);

*/

//�����������frame������
f.addWindowListener(this); 
f.setSize(300,280);
f.setVisible(true);
//f.pack();





p.setForeground(white);
p.setBackground(black);
tf.setBackground(snow1);

b1.setBackground(black);
b2.setBackground(black);
b3.setBackground(black);
b4.setBackground(black); 
b5.setBackground(red1);
b6.setBackground(red1);
b7.setBackground(black);
b8.setBackground(black); 
b9.setBackground(black);
b10.setBackground(black);
b11.setBackground(black);
b12.setBackground(black);
b13.setBackground(black);
b14.setBackground(black);
b15.setBackground(black);
b16.setBackground(black);
b17.setBackground(black);
b18.setBackground(black);
b19.setBackground(black);
b20.setBackground(black);
b21.setBackground(black);
b22.setBackground(black);
b23.setBackground(black);
b24.setBackground(black);
b25.setBackground(black);
b26.setBackground(black);
b27.setBackground(black);
b28.setBackground(black);
b29.setBackground(black);
b30.setBackground(black);

/*b31.setBackground(red);
b32.setBackground(red);
b33.setBackground(red);
b34.setBackground(red);
b35.setBackground(red);
b36.setBackground(red);
b37.setBackground(red);
b38.setBackground(red);
b39.setBackground(red);
b40.setBackground(red);
b41.setBackground(red);
b42.setBackground(red);
b43.setBackground(red);
b44.setBackground(red);
b45.setBackground(red);
b46.setBackground(red);
b47.setBackground(red);
b48.setBackground(red);
b49.setBackground(red);
b50.setBackground(red);
b51.setBackground(red);
b52.setBackground(red);
b53.setBackground(red);
b54.setBackground(red);
*/

b1.setForeground(white);
b2.setForeground(white);
b3.setForeground(white);
b4.setForeground(white);
b5.setForeground(white);
b6.setForeground(white);
b7.setForeground(white);
b8.setForeground(white);
b9.setForeground(white);
b10.setForeground(white);
b11.setForeground(white);
b12.setForeground(white);
b13.setForeground(white);
b14.setForeground(white);
b15.setForeground(white);
b16.setForeground(white);
b17.setForeground(white);
b18.setForeground(white);
b19.setForeground(white);
b20.setForeground(white);
b21.setForeground(white);
b22.setForeground(white);
b23.setForeground(white);
b24.setForeground(white);
b25.setForeground(white);
b26.setForeground(white);
b27.setForeground(white);
b28.setForeground(white);
b29.setForeground(white);
b30.setForeground(white);
/*
b31.setForeground(white);
b32.setForeground(white);
b33.setForeground(white);
b34.setForeground(white);
b35.setForeground(white);
b36.setForeground(white);
b37.setForeground(white);
b38.setForeground(white);
b39.setForeground(white);
b40.setForeground(white);
b41.setForeground(white);
b42.setForeground(white);
b43.setForeground(white);
b44.setForeground(white);
b45.setForeground(white);
b46.setForeground(white);
b47.setForeground(white);
b48.setForeground(white);
b49.setForeground(white);
b50.setForeground(white);
b51.setForeground(white);
b52.setForeground(white);
b53.setForeground(white);
b54.setForeground(white);
*/


}

public void keyPressed(KeyEvent e){}
public void keyReleased(KeyEvent e){

Character Char1=new Character(e.getKeyChar());

s=Char1.toString();

if(e.getKeyCode()==10){
s="=";
}

if(e.getKeyCode()==27){
s="C";
}

if(e.getKeyCode()==8){
s="Backspace";
}



if(s.equals("C")){
//�����������Ϊ��ʼ��������������
result=0;
data1=0;
prec='+';
radixPointDepth=1;
numberPressIndicate=false;
radixPointIndicate=false;

//��ʾ���
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());
}



if(s.equals("Backspace")){
// if(radixPointIndicate){
// radixPointDepth=radixPointDepth*10;
// }
// else{
// data1=(data1/10);
// }
}



switch(s.charAt(0)){
//�����������
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
//����Ⱥż��ֱ�Ӱ��κ����ּ��������ΪӦ���������¼���
if(equalSignPressIndicate){
//�����������Ϊ��ʼ��������������
result=0;
data1=0;
prec='+';
radixPointDepth=1;
numberPressIndicate=false;
radixPointIndicate=false;


}

Integer Int1=new Integer(s); 

if(radixPointIndicate){
radixPointDepth=radixPointDepth/10;
data1=data1+(Int1.intValue())*radixPointDepth;
}
else{
data1=data1*10+(Int1.intValue());
}

numberPressIndicate=true;
equalSignPressIndicate=false;

//��ʾ���
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());

break;

//�ڰ�+ - * / =�ź������
case '+': case '-':case '*':case '/':case '=':
if(s.charAt(0)!='='&&equalSignPressIndicate){
prec=s.charAt(0);
equalSignPressIndicate=false;
}
else{
switch(prec){
case '+':
result=result+data1;
break;
case '-':
result=result-data1;
break;
case '*':
result=result*data1;
break;
case '/':
result=result/data1;
break;

}
}
radixPointIndicate=false;
radixPointDepth=1;
numberPressIndicate=false;


if(s.charAt(0)!='='){
data1=0;
prec=s.charAt(0);
} 
else{
equalSignPressIndicate=true;
}

//��ʾ���
displayNumber=new Double(result);
tf.setText(displayNumber.toString());

break;

case '.':
radixPointIndicate=true;
numberPressIndicate=true;

break;


case '%':
if(equalSignPressIndicate||(numberPressIndicate==false)){
result=result*100;
displayNumber=new Double(result);
tf.setText(displayNumber.toString());

}
else{
data1=data1/100;
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());
}
break;




}





}
public void keyTyped(KeyEvent e){
}
public void actionPerformed(ActionEvent e){


s=e.getActionCommand();

//��ѧ�������Ĳ���
if(s.equals("hyp")){
}

if(s.equals("sin")){
//����sin������������ڵ�ǰ���������sin����������sin������ǰһ�εĲ���ȷ��
//public calcSqrt()
if(equalSignPressIndicate||(numberPressIndicate==false)){
result=Math.sin(result);
displayNumber=new Double(result);
tf.setText(displayNumber.toString());
}
else{
data1=Math.sin(data1);
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());
}
}

if(s.equals("cos")){
//����cos������������ڵ�ǰ���������cos����������cos������ǰһ�εĲ���ȷ��
//public calcSqrt()
if(equalSignPressIndicate||(numberPressIndicate==false)){
result=Math.cos(result);
displayNumber=new Double(result);
tf.setText(displayNumber.toString());
}
else{
data1=Math.cos(data1);
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());
}
}

if(s.equals("tan")){
//����tan������������ڵ�ǰ���������tan����������tan������ǰһ�εĲ���ȷ��
//public calcSqrt()
if(equalSignPressIndicate||(numberPressIndicate==false)){
result=Math.tan(result);
displayNumber=new Double(result);
tf.setText(displayNumber.toString());
}
else{
data1=Math.tan(data1);
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());
}
}


if(s.equals("F-E")){
}
if(s.equals("n!")){
}
if(s.equals("DEG")){
}
if(s.equals("ln")){

//����ln������������ڵ�ǰ���������ln����������ln������ǰһ�εĲ���ȷ��
//public calcSqrt()
if(equalSignPressIndicate||(numberPressIndicate==false)){
result=Math.log(result);
displayNumber=new Double(result);
tf.setText(displayNumber.toString());
}
else{
data1=Math.log(data1);
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());
}


}

if(s.equals("log")){
//����log������������ڵ�ǰ���������log����������log������ǰһ�εĲ���ȷ��
//public calcSqrt()
if(equalSignPressIndicate||(numberPressIndicate==false)){
result=(Math.log(result))/(Math.log(10));
displayNumber=new Double(result);
tf.setText(displayNumber.toString());
}
else{
data1=(Math.log(data1))/(Math.log(10));
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());
}

}


if(s.equals("a")){
}
if(s.equals("b")){
}
if(s.equals("->")){
}

if(s.equals("exp")){
//����exp������������ڵ�ǰ���������exp����������exp������ǰһ�εĲ���ȷ��
//public calcSqrt()
if(equalSignPressIndicate||(numberPressIndicate==false)){
result=Math.exp(result);
displayNumber=new Double(result);
tf.setText(displayNumber.toString());
}
else{
data1=Math.exp(data1);
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());
}
}




if(s.equals("y^x")){

//����exp������������ڵ�ǰ���������exp����������exp������ǰһ�εĲ���ȷ��
//public calcSqrt()
if(equalSignPressIndicate||(numberPressIndicate==false)){
result=result;
displayNumber=new Double(result);
tf.setText(displayNumber.toString());
}
else{
result=data1;
displayNumber=new Double(result);
tf.setText(displayNumber.toString());
}

prec='p';
radixPointIndicate=false;
radixPointDepth=1;
numberPressIndicate=false;
data1=0;
}


if(s.equals("x^-2")){
}
if(s.equals("x^2")){
}
if(s.equals("(")){
}
if(s.equals(")")){
}
if(s.equals("")){
}
if(s.equals("")){
}





if(s.equals("OFF")){
System.exit(0);
}

if(s.equals("C")){
//�����������Ϊ��ʼ��������������
result=0;
data1=0;
prec='+';
radixPointDepth=1;
numberPressIndicate=false;
radixPointIndicate=false;

//��ʾ���
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());
}


if(s.equals("CE")){
//�����������Ϊ��ʼ��������������
result=0;
data1=0;
prec='+';
radixPointDepth=1;
numberPressIndicate=false;
radixPointIndicate=false;

//��ʾ���
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());
}


if(s.equals("Backspace")){
// if(radixPointIndicate){
// radixPointDepth=radixPointDepth*10;
// }
// else{
// data1=(data1/10);
// }
}


if(s.equals("MC")){
memDataIndicate=false;
memData=0;

}

if(s.equals("MR")&&memDataIndicate){
//����sqrt������������ڵ�ǰ���������ȡ��ƽ������������ȡ��ƽ��������ǰһ�εĲ���ȷ��

data1=memData;

equalSignPressIndicate=true;
radixPointDepth=1;
radixPointIndicate=false;
//��ʾ���
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());

}
if(s.equals("MS")){
//����sqrt������������ڵ�ǰ���������ȡ��ƽ������������ȡ��ƽ��������ǰһ�εĲ���ȷ��
if(equalSignPressIndicate||(numberPressIndicate==false)){
memData=result;
//displayNumber=new Double(result);
//tf.setText(displayNumber.toString());
}
else{
memData=data1;
//displayNumber=new Double(data1);
//tf.setText(displayNumber.toString());
}
equalSignPressIndicate=true;
memDataIndicate=true;
prec='+';
radixPointDepth=1;
radixPointIndicate=false;

}
if(s.equals("M+")){
//����sqrt������������ڵ�ǰ���������ȡ��ƽ������������ȡ��ƽ��������ǰһ�εĲ���ȷ��
if(equalSignPressIndicate||(numberPressIndicate==false)){
memData=memData+result;
//displayNumber=new Double(result);
//tf.setText(displayNumber.toString());
}
else{
memData=memData+data1;
//displayNumber=new Double(data1);
//tf.setText(displayNumber.toString());
}
equalSignPressIndicate=true;
memDataIndicate=true;
prec='+';
radixPointDepth=1;
radixPointIndicate=false;


}




if(s.equals("sqrt")){
//����sqrt������������ڵ�ǰ���������ȡ��ƽ������������ȡ��ƽ��������ǰһ�εĲ���ȷ��
//public calcSqrt()
if(equalSignPressIndicate||(numberPressIndicate==false)){
result=Math.sqrt(result);
displayNumber=new Double(result);
tf.setText(displayNumber.toString());
}
else{
data1=Math.sqrt(data1);
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());
}

}
//����1���1/x��ĵ�һ���ַ�Ϊ1��+/-���+��ĵ�һ���ַ�Ϊ+�����ԼӴ��ж������ֺͲ������ַ��������ǰ
if(s.equals("1/x")||s.equals("+/-")){
if(s.equals("1/x")){
//����1/x������������ڵ�ǰ���������ȡ��������������������ǰһ�εĲ���ȷ��
if(equalSignPressIndicate||(numberPressIndicate==false)){
result=1/result;
displayNumber=new Double(result);
tf.setText(displayNumber.toString());
}
else{
data1=1/data1;
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());
}
}
if(s.equals("+/-")){
//����+/-������������ڵ�ǰ���������ȡ������������ȡ��������ǰһ�εĲ���ȷ��
if(equalSignPressIndicate||(numberPressIndicate==false)){
result=0-result;
displayNumber=new Double(result);
tf.setText(displayNumber.toString());
}
else{
data1=0-data1;
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());
}
}


}
else{

switch(s.charAt(0)){
//�����������
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
//����Ⱥż��ֱ�Ӱ��κ����ּ��������ΪӦ���������¼���
if(equalSignPressIndicate){
//�����������Ϊ��ʼ��������������
result=0;
data1=0;
prec='+';
radixPointDepth=1;
numberPressIndicate=false;
radixPointIndicate=false;


}

Integer Int1=new Integer(s); 

if(radixPointIndicate){
radixPointDepth=radixPointDepth/10;
data1=data1+(Int1.intValue())*radixPointDepth;
}

else{
data1=data1*10+(Int1.intValue());
}

numberPressIndicate=true;
equalSignPressIndicate=false;

//��ʾ���
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());

break;

//�ڰ�+ - * / =�ź������
case '+': case '-':case '*':case '/':case '=':
if(s.charAt(0)!='='&&equalSignPressIndicate){
prec=s.charAt(0);
equalSignPressIndicate=false;
}
else{
switch(prec){
case '+':
result=result+data1;
break;
case '-':
result=result-data1;
break;
case '*':
result=result*data1;
break;
case '/':
result=result/data1;
break;
case 'p':
result=Math.pow(result,data1);

}
}
radixPointIndicate=false;
radixPointDepth=1;
numberPressIndicate=false;


if(s.charAt(0)!='='){
data1=0;
prec=s.charAt(0);
} 
else{
equalSignPressIndicate=true;
}

//��ʾ���
displayNumber=new Double(result);
tf.setText(displayNumber.toString());

break;

case '.':
radixPointIndicate=true;
numberPressIndicate=true;

break;


case '%':
if(equalSignPressIndicate||(numberPressIndicate==false)){
result=result*100;
displayNumber=new Double(result);
tf.setText(displayNumber.toString());

}
else{
data1=data1/100;
displayNumber=new Double(data1);
tf.setText(displayNumber.toString());
}
break;




}
}
}

public void windowClosing(WindowEvent e){
System.exit(0);
}
}
